/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistence;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import model.Persoon;
import model.Voorstelling;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Matthy & Jelle
 */
public class VoorstellingService extends AbstractService{

  public List<Voorstelling> zoekVoorstelling(Date begin, Date einde, Persoon persoon) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    Query query = session.createQuery(
      "select v from Voorstelling v "
      + "join v.film.functies functie "
      + "where v.tijdstip > :begin "
      + "and v.tijdstip < :einde "
      + "and functie.persoon.id = :persoonid"
    );
    query.setDate("begin", begin);
    query.setDate("einde", einde);
    query.setInteger("persoonid", persoon.getId());
    List<Voorstelling> voorstellingen = query.list();
    session.getTransaction().commit();
    return voorstellingen;
  }

  @Override
  public boolean validate(Object o) {
    Voorstelling v = (Voorstelling)o;
    if (v.getZaal() == null) {
      return false;
    }
    else {
      ZaalService zs = new ZaalService();
      if (!zs.validate(v.getZaal())) {
        return false;
      }
    }
    if (v.getFilm() == null) {
      return false;
    }
    else {
      FilmService fs = new FilmService();
      if (!fs.validate(v.getFilm())) {
        return false;
      }
    }

    if (hasVoorstelling(v)) {
      return false;
    }
    return true;

  }

  private Boolean hasVoorstelling(Voorstelling v) {
    Date begin = v.getTijdstip();
    Calendar c = Calendar.getInstance();
    c.setTime(v.getTijdstip());
    c.add(Calendar.MINUTE, v.getFilm().getSpeelDuur());
    Date einde = c.getTime();

    List<Voorstelling> voorstellingen;

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    c.setTime(begin);
    c.set(Calendar.HOUR, 0);
    c.set(Calendar.MINUTE, 0);

    Date beginDay = c.getTime();
    c.set(Calendar.HOUR, 23);
    c.set(Calendar.MINUTE, 59);
    Date endDay = c.getTime();

    Query query = session.createQuery("from Voorstelling v where v.zaal.id = :zaalid and v.tijdstip >= :beginday and v.tijdstip <= :endday");
    query.setInteger("zaalid", v.getZaal().getId());
    query.setTimestamp("beginday", beginDay);
    query.setTimestamp("endday", endDay);
    voorstellingen = query.list();
    for (Voorstelling voorstelling : voorstellingen) {
      if (voorstelling.getId() != v.getId()) {
        Date voorstellingbegin = voorstelling.getTijdstip();
        c.setTime(voorstellingbegin);
        c.add(Calendar.MINUTE, voorstelling.getFilm().getSpeelDuur());
        Date voorstellingeinde = c.getTime();
        if (einde.after(voorstellingbegin) && begin.before(voorstellingeinde)) {
          session.getTransaction().commit();
          return true;
        }
      }
    }
    session.getTransaction().commit();
    return false;
  }

  public List<Voorstelling> getVoorstellingen(Date date) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery("from Voorstelling v where v.tijdstip >= :date");
    query.setTimestamp("date", date);
    List<Voorstelling> voorstellingen = query.list();
    session.getTransaction().commit();
    return voorstellingen;
  }
  
  public List<Voorstelling> getXMLVoorstellingen(Date begin, Date einde) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery("from Voorstelling v where v.tijdstip >= :date1 and v.tijdstip <= :date2 order by v.zaal.complex.id, EXTRACT(YEAR FROM 'v.tijdstip'), DAYOFYEAR(v.tijdstip), v.zaal.id, v.tijdstip");
    query.setTimestamp("date1", begin);
    query.setTimestamp("date2", einde);
    List<Voorstelling> voorstellingen = query.list();
    session.getTransaction().commit();
    return voorstellingen;
  }

  public List<Voorstelling> getVoorstellingen() {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery("from Voorstelling");
    List<Voorstelling> voorstellingen = query.list();
    session.getTransaction().commit();
    return voorstellingen;
  }

}
